package cn.kgm.bitmap;


/**
 * Create by kappi on
 * 2021/12/24/024 17:08
 */
public class BItMap {

    public static void main(String[] args) {
        int site = 7;
        byte[] bits = new byte[getIndex(site) + 1];
        add(bits,site);
        System.out.println(bits);
    }

    public static int getIndex(int num){
        // 这里相当于 num/8 之所以用 8是因为byte里面有8个bit（bitmap 是每个bit标记一个位置 ）
        return num >> 3;
    }

    public static int getPosition(int num){
        // 计算num该在一个byte中的位置（取值范围是0-7共8个）
        return num & 0x07;
    }

    /**
     * 标记指定数字（num）在bitmap中的值，标记其已经出现过
     * 将1左移position后，那个位置自然就是1，然后和以前的数据做|，这样，那个位置就替换成1了
     * @param bits
     * @param num
     */
    public static void add(byte[] bits, int num){
        bits[getIndex(num)] |= 1 << getPosition(num);
    }

    /**
     * 判断指定数字num是否存在<br/>
     * 将1左移position后，那个位置自然就是1，然后和以前的数据做&，判断是否为0即可
     * @param bits
     * @param num
     * @return
     */
    public static boolean contains(byte[] bits, int num){
        return (bits[getIndex(num)] & 1 << getPosition(num)) != 0;
    }
}
